1. 首页 > 游戏经验

冒险岛脚本(冒险岛单机版本如何编写简单的NPC脚本)

冒险岛单机版的玩家作为游戏里的GM,能随意调用各种权限与GM工具操作游戏内的数据。如果想让游戏本身的功能性可玩性更强,有能力的玩家可以改写游戏数据,下面我们来简单了解下如何改写添加游戏中NPC的功能:编写NPC脚本。

首先各个冒险岛单机版版本的NPC文件一般都在服务端的\scripts\npc文件夹中,其中文件的名字对应游戏中NPC的代码:也就是说如果游戏中射手村村长长老斯坦的ID是:1012003,你只要修改\scripts\npc\1012003文件就能改变这个NPC的作用。(如果你发现没有这段代码你可以把其他文件重命名改成这个代码试试)

因为可能会编程的人是少数,我们就来简单分析个例子。下图是一个简单的实现在NPC对话中,点击选项栏中的"测试给我15星",给玩家15星强化卷轴的代码。其中只要大家细细琢磨下,会发现里面的"2049349"是物品的ID,而后面的5代表给的数量,因为"2049349"是15星强化卷轴的ID,所以会给15星强化卷。如果我们改成其他物品的ID,那么就会给那个物品了。(看到这个文件的名字了吗,那是NPC代码,你想哪个NPC实现这个代码的功能,就改成那个NPC的ID放进\scripts\npc中,主义文件后缀不是txt哦。)

下面我把代码贴出来大家可以试验试验。

function start() {

cm.sendSimple ("领取物品: #L0##r1:测试给我15星 #k\r\n");

}

function action(mode, type, selection) {

cm.dispose();

if (selection == 0) {

cm.gainItem(2049349, 5 );

}else {

cm.dispose();

}

}

再把个多重选项的代码贴出来,能活用上面的代码时改这个应该不难了。

var status = 0;

function start() {

status = -1;

action(1, 0, 0);

}

function action(mode, type, selection) {

if (status == 0 && mode == 0) {

cm.dispose();

return;

}

if (mode == 1) {

status++;

} else {

status--;

}

if (status == 0) {

var selStr = "领取会员福利:\r\n点击领取哦\r\n#b#L0#日常极品#l\r\n#L1#漩涡双手剑#l\r\n#L2#突破百万之石#l\r\n#L3#手套攻击卷轴#l\r\n#L4#漩涡弓#l\r\n#b#L5#漩涡双弩#l\r\n#b#L6#肃清者套装#l\r\n#b#L7#暗炎赎罪者套装#l\r\n#b#L8#漩涡套装#l\r\n#b#L9#奥尔卡套装#l\r\n#b#L10#漩涡恶魔剑#l\r\n#b#L11#漩涡手杖#l\r\n#b#L12#漩涡灵魂手铳#l\r\n#b#L13#漩涡长杖#l\r\n#b#L14#先代狂龙战士套装#l\r\n#b#L15#漩涡匕首#l\r\n#b#L16#斯乌套装#l\r\n#b#L17#漩涡锁链剑#l\r\n#b#L18#死亡之刃套装#l";

cm.sendSimple(selStr);

} else if (status == 1) {

switch (selection) {

case 0:

if (cm.getMeso() >= 1) {

cm.gainItem(1112312,1)

cm.gainItem(1112495,1)

cm.gainItem(1112763,1)

cm.gainItem(1112597,1)

cm.gainItem(1113028,1)

cm.gainItem(1132246,1)

cm.gainItem(1122267,1)

cm.gainItem(1032223,1)

cm.gainItem(1113075,1)

cm.gainItem(1202031,1)

cm.gainItem(1202083,1)

cm.gainItem(1202023,1)

cm.gainItem(1672027,1)

cm.gainItem(1142788,1)

cm.gainItem(1182147,1)

cm.gainItem(1122076,1)

cm.gainItem(2041200,3)

cm.gainItem(1022232,1)

cm.gainItem(1012478,1)

cm.gainItem(1190407,1)

cm.gainItem(4032933,1)

cm.gainItem(1162025,1)

cm.gainItem(1152170,1)

cm.gainItem(2000005,300)

cm.gainItem(2050004,300)

cm.gainItem(4001017,100)

cm.gainItem(4031179,100)

} else {

cm.sendOk("金币不足");

}

break;

case 1:

if (cm.getMeso() >= 1) {

cm.gainItem(1402220,1)

} else {

cm.sendOk("金币不足");

}

break;

case 2:

if (cm.getMeso() >= 1) {

cm.gainItem(2614019,100);

} else {

cm.sendOk("金币不足");

}

break;

case 3:

if (cm.getMeso() >= 1) {

cm.gainItem(2040804,100);

cm.gainItem(2040805,100);

cm.gainItem(2040810,100);

cm.gainItem(2040811,100);

} else {

cm.sendOk("金币不足");

}

break;

case 4:

if (cm.getMeso() >= 1) {

cm.gainItem(1452226,1)

cm.gainItem(2061008,9999)

cm.gainItem(2061008,9999)

cm.gainItem(2061008,9999)

cm.gainItem(2061008,9999)

cm.gainItem(2061008,9999)

cm.gainItem(2061008,9999)

cm.gainItem(2061008,9999)

cm.gainItem(2061008,9999)

cm.gainItem(2061008,9999)

cm.gainItem(2061008,9999)

cm.gainItem(2061008,9999)

cm.gainItem(2061008,9999)

} else {

cm.sendOk("金币不足");

}

break;

case 5:

if (cm.getMeso() >= 1) {

cm.gainItem(1522113,1)

} else {

cm.sendOk("金币不足");

}

break;

case 6:

if (cm.getMeso() >= 1) {

cm.gainMeso( - 1);

cm.gainItem(1052709,1)

cm.gainItem(1004095,1)

cm.gainItem(1102671,1)

cm.gainItem(1072911,1)

cm.gainItem(1702490,1)

} else {

cm.sendOk("金币不足");

}

break;

case 7:

if (cm.getMeso() >= 1) {

cm.gainItem(1102605,1)

cm.gainItem(1052643,1)

cm.gainItem(1072848,1)

cm.gainItem(1003934,1)

} else {

cm.sendOk("金币不足");

}

break;

case 8:

if (cm.getMeso() >= 1) {

cm.gainItem(1003976,1)

cm.gainItem(1102623,1)

cm.gainItem(1082556,1)

cm.gainItem(1052669,1)

cm.gainItem(1072870,1)

} else {

cm.sendOk("金币不足");

}

break;

case 9:

if (cm.getMeso() >= 1) {

cm.gainItem(1003390,1)

cm.gainItem(1003533,1)

cm.gainItem(1004146,1)

cm.gainItem(1052416,1)

cm.gainItem(1052360,1)

cm.gainItem(1072622,1)

} else {

cm.sendOk("金币不足");

}

break;

case 10:

if (cm.getMeso() >= 1) {

cm.gainItem(1232084,1)

} else {

cm.sendOk("金币不足");

}

break;

case 11:

if (cm.getMeso() >= 1) {

cm.gainItem(1362109,1)

cm.gainItem(1702120,1)

} else {

cm.sendOk("金币不足");

}

break;

case 12:

if (cm.getMeso() >= 1) {

cm.gainItem(1222084,1)

} else {

cm.sendOk("金币不足");

}

break;

case 13:

if (cm.getMeso() >= 1) {

cm.gainItem(1382231,1)

cm.gainItem(1092089,1)

cm.gainItem(1092106,1)

} else {

cm.sendOk("金币不足");

}

break;

case 14:

if (cm.getMeso() >= 1) {

cm.gainItem(1003625,1)

cm.gainItem(1052532,1)

cm.gainItem(1072751,1)

} else {

cm.sendOk("金币不足");

}

break;

case 15:

if (cm.getMeso() >= 1) {

cm.gainItem(1332247,1)

cm.gainItem(1092049,1)

cm.gainItem(1342082,1)

} else {

cm.sendOk("金币不足");

}

break;

case 16:

if (cm.getMeso() >= 1) {

cm.gainItem(1004140,1)

cm.gainItem(1052576,1)

cm.gainItem(1072783,1)

cm.gainItem(1004336,1)

cm.gainItem(1052852,1)

} else {

cm.sendOk("金币不足");

}

break;

case 17:

if (cm.getMeso() >= 1) {

cm.gainItem(1242090)

} else {

cm.sendOk("金币不足");

}

break;

case 18:

if (cm.getMeso() >= 1) {

cm.gainItem(1702565,1)

cm.gainItem(1102809,1)

cm.gainItem(1004450,1)

cm.gainItem(1073041,1)

} else {

cm.sendOk("金币不足");

}

break;

case 19:

if (cm.getMeso() >= 1) {

cm.setEnhance(1);

} else {

cm.sendOk("金币不足");

}

break;

}

cm.dispose();

}

}

以上的内容仅供非编程人员参考,这里贴出基本语法,有更多想法的同学可以琢磨琢磨哦。

格式:cm.[Commands]

dispose

对话结束

示例:cm.dispose();

sendNext

显示一个带“继续”按钮的对话窗口

示例:cm.sendNext("[text]");

sendPrev

显示一个带“返回”按钮的对话窗口

示例:cm.sendPrev("[text]");

sendNextPrev

显示一个带“继续”和“返回”按钮的对话窗口

示例:cm.sendNextPrev("[text]");

sendOk

显示一个带“好”按钮的对话窗口

示例:cm.sendOk("[text]");

sendYesNo

显示一个带“是”和“否”按钮的对话窗口,选“否”结束对话,否则做相反处理。

示例:cm.sendYesNo("[text]");

sendAcceptDecline

显示一个带“接受”和“拒绝”按钮的对话窗口,选“拒绝”结束对话,否则做相反处理。

示例:cm.sendAcceptDecline("[text]");

sendSimple

显示一个无按钮的对话窗口

示例:cm.sendAcceptSimple("[text]");

sendStyle

显示一个选择性的对话窗口

示例:cm.sendStyle("[Text]", [variable]); //需要声明一个变量

warp

传送玩家到指定地图

示例:cm.warp([mapid], [portal]); //[portal]位置值,默认为0

openShop

打开一个商店窗口

示例:cm.openShop([shopid]);

haveItem

检查玩家是否具有指定物品

示例:cm.haveItem([itemid]); //物品栏和装备栏

gainItem

给予或取走玩家指定物品

示例:cm.gainItem([itemid],[ammount]); //-[ammount]表示取走数量

changeJob

改变玩家职业

示例:cm.changeJob([jobid]);

getJob

取得玩家职业值

示例:cm.getJob();

startQuest

开始任务

示例:cm.startQuest([questid]);

completeQuest

完成任务

示例:cm.completeQuest([questid]);

forfeitQuest

解除任务

示例:cm.forfeitQuest([questid]);

getMeso

取得玩家金币数量值

示例:cm.getMeso();

gainMeso

给予或取走玩家指定数量金币

示例:cm.gainMeso([ammount]); //-[ammount]表示取走数量

gainExp

给予或取走玩家指定数量经验值

示例:cm.gainExp([ammount]); //-[ammount]表示取走数量

getLevel

取得玩家等级值

示例:cm.getLevel();

teachSkill

给予玩家指定技能

示例:cm.teachSkill([skillid],[skilllevel],[maxskilllevel]);

//[skillid]技能代码 [skilllevel]技能等级 [maxskilllevel]等级上限

isGM

判断玩家是否为GM

示例:cm.isGM();

get[Stat]

取得玩家状态值

示例:cm.get[Stat](); //[Stat]值的顺序为:HP, MP, STR, DEX, INT, LUK

#k 黑色字

#e 粗体字

#b 蓝色字

#d 紫色字

#g 绿色字

#r 红色字

#n 普通字(移除粗体)

#c[itemid]# 显示为玩家物品栏里指定物品的数量

#f[imagelocation]# 引用.wz文件里的图片

#h # 显示为玩家名字

#l - Selection close.选择关闭?(不知道什么意思)

#L[number]# - Selection open.选择打开?

#m[mapid]# 显示为地图名称

#o[mobid]# 显示为怪物名称

#p[npcid]# 显示为NPC名称

#q[skillid]# 显示为技能名称

#s[skillid]# 显示为技能图标

#t[itemid]# 显示为物品名称

#z[itemid]# 显示为物品名称

#v[itemid]# 显示为物品图标

#i[itemid]# 显示为物品图片

#x 显示为0%(不知道什么意思)

#B[%]# 显示为一个进度条

\r\n 在下一行显示

冒险岛是一款经典游戏,很多玩家喜欢玩。今天小编就给大家带来冒险岛服务端修改按教程。一起来看看吧

首先,你要准备一个服务端,这类服务端网上较多,区别只是功能脚本的加密与未加密即网上称其为明文版,还有就是所使用的引擎不同,引擎不同,各功能也会有所差别,具体看个人爱好及市场走势。偶现在用的是BLUE的1008第二版 带引擎注册机,此工具也是偶在网上找来的。

第二,要准备一个数据库引擎 DBC2000 这国披工具网上一搜很多,特别像一些私服服务端下载站都有此工具下载。你可以在网上找找。

第三,需要一个地图编辑器和一个补丁编辑器,例如我在使用的补丁编辑器名称为:WIL编辑器V4.01 你可以上网搜下。

第四,你需要网上找一些私服的安装及版本修改教程,尽里找一些视频教程,此类教程网上也比较多这里就不多说了,请自己搜搜。

第五,依据你所使用的服务端引擎,即网上说的M2,搜索一下与之相关的CHM文件,施海即说明文档,里面有此引擎的各类脚本变量的说明。 假如我使用的是BLUE M2 1008版 ,我压此泥就得在网上搜索BLUE 1008 帮助文档。

第六,脚本的编辑。网上有很多脚本编辑器,只是有些变量与你所使用的引擎不同,具体的还要看引擎支持哪种变量,哪种方式。